package com.xdog.okx.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * OKX API错误码枚举
 * 用于统一管理API返回的错误码及对应信息
 */
@Getter
@AllArgsConstructor
public enum OkxApiError {

    /**
     * 通用类错误
     */
    SUCCESS("0", 200, "操作成功"),
    BODY_EMPTY("50000", 400, "body不能为空"),
    SERVICE_UNAVAILABLE("50001", 503, "服务暂时不可用，请稍后重试"),
    INVALID_JSON("50002", 400, "非法的json数据"),
    REQUEST_TIMEOUT("50004", 400, "接口请求超时（不代表请求成功或者失败，请检查请求结果）"),
    API_OFFLINE("50005", 410, "接口已下线或无法使用"),
    INVALID_CONTENT_TYPE("50006", 400, "无效的Content_Type，请使用\"application/json\"格式"),
    ACCOUNT_BANNED("50007", 200, "账户被封禁"),
    ACCOUNT_NOT_EXIST("50008", 200, "账户不存在"),
    ACCOUNT_SUSPENDED("50009", 200, "账户因清算被暂停使用"),
    USER_ID_EMPTY("50010", 200, "用户ID为空"),
    REQUEST_TOO_FREQUENT("50011", 429, "用户请求频率过快，超过该接口允许的限额"),
    INVALID_ACCOUNT_STATUS("50012", 429, "账户状态无效"),
    SYSTEM_BUSY("50013", 200, "当前系统繁忙，请稍后重试"),
    PARAMETER_REQUIRED("50014", 400, "必填参数{0}不能为空"),
    PARAMETERS_BOTH_EMPTY("50015", 400, "参数{0}和{1}不能同时为空"),
    PARAMETERS_MISMATCH("50016", 400, "参数{0}和{1}不匹配"),
    PARAMETERS_CONFLICT("50024", 200, "参数{0}和{1}不能同时存在"),
    PARAMETER_LIMIT_EXCEEDED("50025", 200, "参数{0}传值个数超过最大限制{1}"),
    SYSTEM_ERROR("50026", 500, "系统错误"),
    NO_API_PERMISSION("50030", 403, "您没有该API接口的访问权限，需要升级您的账户付费等级"),
    PARAMETER_ERROR("50036", 400, "参数{%}错误"),
    TOKEN_NOT_EXIST("50037", 200, "代币不存在"),
    CHAIN_NOT_SUPPORTED("50038", 200, "该公链不支持"),
    ALERT_NO_HISTORY("50039", 200, "该警报ID没有历史处理记录"),
    BLOCK_NO_DATA("50040", 200, "此区块高度无数据"),
    TOKEN_BALANCE_NOT_SUPPORTED("50041", 200, "当前不支持该代币的历史余额查询"),
    TOKEN_RISK_SCAN_NOT_SUPPORTED("50042", 200, "该代币不支持风险扫描"),
    ACCOUNT_FROZEN("50043", 200, "您的账户行为触发了风险控制，API功能已冻结。可以通过apiservice@oklink.com与我们联系。"),
    DATA_NOT_EXIST("50044", 400, "数据不存在"),
    CLIENT_OPERATION_ERROR("50045", 400, "客户端操作错误"),
    GEO_BLOCKED("50047", 400, "根据法律法规，您所在的国家或地区无法使用 X Layer API 服务"),

    /**
     * 鉴权类错误
     */
    API_FROZEN("50100", 400, "Api 已被冻结，请联系客服处理"),
    TIMESTAMP_EXPIRED("50102", 401, "请求时间戳过期"),
    ACCESS_KEY_EMPTY("50103", 401, "请求头\"OK_ACCESS_KEY\"不能为空"),
    PASSPHRASE_EMPTY("50104", 401, "请求头\"OK_ACCESS_PASSPHRASE\"不能为空"),
    PASSPHRASE_INVALID("50105", 401, "请求头\"OK_ACCESS_PASSPHRASE\"错误"),
    SIGN_EMPTY("50106", 401, "请求头\"OK_ACCESS_SIGN\"不能为空"),
    TIMESTAMP_EMPTY("50107", 401, "请求头\"OK_ACCESS_TIMESTAMP\"不能为空"),
    INVALID_IP("50110", 401, "无效的IP"),
    ACCESS_KEY_INVALID("50111", 401, "无效的OK_ACCESS_KEY"),
    TIMESTAMP_INVALID("50112", 401, "无效的OK_ACCESS_TIMESTAMP"),
    INVALID_SIGN("50113", 401, "无效的签名"),
    INVALID_AUTHORIZATION("50114", 401, "无效的授权"),
    INVALID_REQUEST_TYPE("50115", 405, "无效的请求类型"),
    QUERY_RANGE_EXCEEDED("50117", 400, "超过了历史数据查询的范围"),

    /**
     * 业务类错误
     */
    PARAMETER_INVALID("51000", 404, "{0}参数错误"),
    OUTPUT_ADDRESS_NOT_FOUND("51001", 200, "您填写的outputAddress地址在该交易中没有找到。"),
    OUTPUT_ADDRESS_NOT_EXIST("51002", 200, "这个索引所指定的outputAddress在这个交易中不存在。"),
    TRANSACTION_NOT_FOUND("51003", 200, "该笔交易Hash在区块链上未解析到交易信息，无法确定该笔交易风险详情。");

    /**
     * 错误码
     */
    private final String code;

    /**
     * HTTP状态码
     */
    private final int httpStatus;

    /**
     * 错误信息
     */
    private final String message;

    /**
     * 根据错误码查找对应的枚举值
     *
     * @param code 错误码
     * @return 对应的枚举值，未找到则返回null
     */
    public static OkxApiError findByCode(String code) {
        for (OkxApiError error : values()) {
            if (error.getCode().equals(code)) {
                return error;
            }
        }
        return null;
    }
}